package com.feel.mall.adminservice.controller;

import cn.hutool.captcha.LineCaptcha;
import cn.hutool.core.util.IdUtil;
import com.feel.mall.common.bean.Admin;
import com.feel.mall.common.bean.RespBean;
import com.feel.mall.common.exception.FeelException;
import com.feel.mall.common.service.AdminService;
import com.feel.mall.common.utils.JwtUtil;
import com.feel.mall.common.utils.RedisUtil;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: 刘永钦
 * @Description:
 */
@RestController
@RequestMapping("/admin")
public class AdminController {
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private AdminService adminService;

    @GetMapping("/captcha")
    public RespBean captcha() {
//        创建验证码对象
        LineCaptcha captcha = new LineCaptcha(120, 38, 4, 10);
//        生成唯一的key -雪花算法生成
        String key = IdUtil.getSnowflakeNextIdStr();
//        将key和验证码存入redis   --超时时间1分钟
        redisUtil.set(key, captcha.getCode(), 60);
//        将验证码转换成Base64编码形式
        String imageBase64 = captcha.getImageBase64();
//        将key和base64编码保存在马匹中
        HashMap<String, Object> map = new HashMap<>();
        map.put("key", key);
        map.put("imageBase64Data", imageBase64);
//        将key和Base64图片返回给前端
        return RespBean.ok("生成验证码成功", map);
    }

    @PostMapping("/login")
    public RespBean login(String username, String password, String key, String captchaInput) throws FeelException {
//        判断验证码是否正确
//        从redis中查询验证码判断
        String  captcha = (String)redisUtil.get(key);
        if (captcha == null || !captcha.equalsIgnoreCase(captchaInput)) {
            throw new FeelException("验证码错误");
        }
//        登录
        Admin admin = adminService.login(username, password);
//        生成token
        HashMap<String, Object> map = new HashMap<>();
        map.put("id", admin.getId());
        map.put("username", admin.getUsername());
        map.put("roles", "admin");
        String token = JwtUtil.generateJwt(map);
//        将token返回给用户
        return RespBean.ok("登录成功", token);
    }

    @GetMapping("/test")
    public RespBean test() {
        return RespBean.ok("test");
    }

    /**
     * 从登录用户token中获取登录用户信息
     * @param token
     * @return
     */
    @GetMapping("/info")
    public RespBean getLoginInfo(@RequestHeader("token") String token) {
        // 解析token
        Map<String, Object> map = JwtUtil.parseJwtToMap(token);
        //    获得用户id
        Integer id = (Integer) map.get("id");
        Admin admin = adminService.selectById(id);

        //     返回
        return RespBean.ok("查询成功", admin);
    }

    /**
     *  管理员修改密码部分
     * @param oldPassword
     * @param newPassword
     * @param newPasswordAgain
     * @param token
     * @return
     * @throws FeelException
     */
    @PutMapping("/updatePwd")
    public RespBean updatePwd(String oldPassword, String newPassword, String newPasswordAgain, @RequestHeader("token") String token) throws FeelException {
        if (!newPassword.equals(newPasswordAgain)) {
            throw new FeelException("两次新密码不一致，请重新输入");
        }
        // 解析token
        Map<String, Object> map = JwtUtil.parseJwtToMap(token);
        //    获得用户id
        Integer id = (Integer) map.get("id");

        // 去判断密码正确性
        adminService.updatePwd(oldPassword, newPassword,id);
        return RespBean.ok("修改密码成功，请重新登录");
    }

    /**
     * 管理员修改自己的信息
     * @param admin
     * @return
     */
    @PutMapping("/updateOneInfo")
    public RespBean updateInfo(@RequestBody Admin admin) {
        admin.setPassword(null);
        admin.setSalt(null);
        // admin.setStatus(null);
        adminService.updateInfo(admin);
        return RespBean.ok("修改成功");
    }

    /**
     * 重启密码
     */
    @PutMapping("/resetPwd/{id}")
    public RespBean resetPwd(@PathVariable("id") Integer id) {
        Admin admin = new Admin();
        admin.setId(id);
        adminService.resetPwd(admin);
        return RespBean.ok("重置成功");
    }

    /**
     * 查询全部管理员
     */
    @GetMapping
    public RespBean getALl(Integer pageNum, Integer pageSize) {
        pageNum = pageNum == null || pageNum < 1 ? 1 : pageNum;
        pageSize = pageSize == null || pageSize < 5 ? 5 : pageSize;
        PageInfo<Admin> pageInfo = (PageInfo<Admin>) adminService.getAll(pageNum, pageSize);
        return RespBean.ok("查询成功", pageInfo);
    }

    /**
     * 通过id查询管理员信息
     */
    @GetMapping("/{id}")
    public RespBean getInfo(@PathVariable("id") Integer id) {
        Admin admin = adminService.selectById(id);
        return RespBean.ok("查询成功", admin);
    }

    /**
     *  新增管理员
     */
    @PostMapping()
    public RespBean addInfo(@RequestBody Admin admin) throws FeelException {
        adminService.addInfo(admin);
        return RespBean.ok("新增成功");
    }
}
